/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id: RubroConceptoEstimado.java, 2009/12/06 17:20:22
 * Bisa Corporation (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas
 *
 * Proyecto ITM
 * Autor: Jimmy Ramírez Duque
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package investigaciones_itm.Presupuestos;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import investigaciones_itm.Inicio;
import itm.bo.presupuestos.PresupuestosBO;
import itm.exception.PresupuestoException;
import itm.vo.presupuestos.ComponenteVO;
import itm.vo.presupuestos.rubroProyectoVO;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.model.SelectItem;
import javax.faces.FacesException;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpSession;

/**
 * Gestiona el presupuesto estimado por componente
 * @author jimmy
 */
public class RubroConceptoEstimado extends AbstractPageBean {

    /*********************************************OBJETOS**/
    private EstimacionPresupuestal estimacionPresupuestal;
    private PresupuestosBO presupuestosBO;
    private Inicio inicio;
    /********************************************LISTADOS**/
    private List<rubroProyectoVO> listaRubros = new ArrayList<rubroProyectoVO>();
    private List<rubroProyectoVO> listaRubroProy = new ArrayList<rubroProyectoVO>();
    private List<SelectItem> itemRubros = new ArrayList<SelectItem>();
    private List<ComponenteVO> listaComponentes = new ArrayList<ComponenteVO>();
    /*******************************************VARIABLES**/
    private long idProyecto;
    private long idRubro;
    private double totalPresup;
    private double presupDistribuido;
    private String usuario;
    private HttpSession session;
    /*******************************************VARIABLES COMPONENTES**/
    private HtmlSelectOneMenu menuRubros;
    /*******************************************CONSTANTES**/
    private static final long TIPO_PRESUPUESTO = 1;
    private static final String PRESUP_STATUS_COMPONENT = "E_COM";
    /****************************************Variables que manejan la visibilidad de los componentes**/
    private boolean boolTablaComponente;
    private boolean boolBotonGuardar;
    private boolean boolInputText;
    private boolean boolBotonFinal;

    /**
     * CONSTRUCTOR
     */
    public RubroConceptoEstimado() {
        this.inicializarObjetos();
        this.cargarVariablesSesion();
        this.cargarListaRubros();
        this.calcularPresupuestoExistente();
        this.cargarValriablesSesionLocal();

    }

    /**
     * Inicializa los objetos de la clase
     */
    protected void inicializarObjetos() {
        estimacionPresupuestal = new EstimacionPresupuestal();
        presupuestosBO = new PresupuestosBO();
        inicio = new Inicio();
        this.setBoolBotonGuardar(false);
        this.setBoolInputText(false);
        this.setBoolBotonFinal(true);
    }

    /**
     * Carga los atributos guardados en sesion
     */
    protected void cargarVariablesSesion() {
        if (estimacionPresupuestal.getSesion().getAttribute("idProyecto") != null) {
            this.setIdProyecto((Long) estimacionPresupuestal.getSesion().getAttribute("idProyecto"));
        }
        if (estimacionPresupuestal.getSesion().getAttribute("totalPresup") != null) {
            this.setTotalPresup((Double) estimacionPresupuestal.getSesion().getAttribute("totalPresup"));
        }
        if (inicio.getSession().getAttribute("usuario") != null) {
            this.setUsuario((String) inicio.getSession().getAttribute("usuario"));
        }
        if (estimacionPresupuestal.getSesion().getAttribute("lista.Rubro.Proy") != null) {
            this.setListaRubroProy((List<rubroProyectoVO>) estimacionPresupuestal.getSesion().getAttribute("lista.Rubro.Proy"));
        }
    }

    /**
     * Carga los atributos locales guardados en sesion
     */
    protected void cargarValriablesSesionLocal() {
        if (this.getSession().getAttribute("listaComponentes") != null) {
            this.setListaComponentes((List<ComponenteVO>) this.getSession().getAttribute("listaComponentes"));
        }
        if (this.getSession().getAttribute("idRubro") != null) {
            this.setIdRubro((Long) this.getSession().getAttribute("idRubro"));
        }
        if (this.getSession().getAttribute("boolTablaComponente") != null) {
            this.setBoolTablaComponente((Boolean) this.getSession().getAttribute("boolTablaComponente"));
        }
        if (this.getSession().getAttribute("boolBotonGuardar") != null) {
            this.setBoolBotonGuardar((Boolean) this.getSession().getAttribute("boolBotonGuardar"));
        }
        if (this.getSession().getAttribute("boolInputText") != null) {
            this.setBoolInputText((Boolean) this.getSession().getAttribute("boolInputText"));
        }
        if (this.getSession().getAttribute("presDis") != null) {
            this.setPresupDistribuido((Double) this.getSession().getAttribute("presDis"));
        }
        if (this.getSession().getAttribute("boolBotonFinal") != null) {
            this.setBoolBotonFinal((Boolean) this.getSession().getAttribute("boolBotonFinal"));
        }
    }

    /**
     * Carga los rubros relacionados a un proyecto
     */
    protected void cargarListaRubros() {
        try {

            listaRubros = presupuestosBO.listaRubroProyecto(idProyecto);
            for (int i = 0; i < listaRubros.size(); i++) {
                itemRubros.add(new SelectItem(Integer.toString(listaRubros.get(i).getIdRubro()),
                        listaRubros.get(i).getNombreRubro()));
            }

        } catch (Exception ex) {
            Logger.getLogger(RubroConceptoEstimado.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void calcularPresupuestoExistente() {
        double totalFuente = 0;
        double totalPresupuesto = 0;
        for (int i = 0; i < this.getListaRubroProy().size(); i++) {

            for (int k = 0; k < this.getListaRubroProy().get(i).getListaRubros().size(); k++) {
                totalFuente = totalFuente + this.getListaRubroProy().get(i).getListaRubros().get(k).getValorFuenteF();
            }

            totalPresupuesto = totalPresupuesto + totalFuente;
            totalFuente = 0;

        }

        this.setTotalPresup(totalPresupuesto);
        this.getSession().setAttribute("totalPresup", this.getTotalPresup());
    }

    /**
     * Consulta los componentes pertenecientes a un rubro
     */
    public void actionMenuRubros(ValueChangeEvent vce) {
        try {
            this.setIdRubro(Integer.parseInt(this.getMenuRubros().getValue().toString()));
            this.getSession().setAttribute("idRubro", this.getIdRubro());
            this.setBoolTablaComponente(true);
            this.getSession().setAttribute("boolTablaComponente", this.isBoolTablaComponente());
            if (presupuestosBO.existeCompoEst(idProyecto, idRubro).equals("existe")) {
                listaRubroProy = presupuestosBO.consultarRubProyPresEst(idProyecto);
                this.setBoolBotonGuardar(true);
                this.setBoolInputText(true);
                this.setBoolBotonFinal(false);
            } else {
                this.setBoolBotonGuardar(false);
                this.setBoolInputText(false);
                this.setBoolBotonFinal(true);
            }
            listaComponentes = presupuestosBO.consultaComponentes(Integer.parseInt(this.getMenuRubros().getValue().toString()), this.getIdProyecto());
            if (listaRubroProy.get(0).getStatus().equals("E_COM")) {
                this.setIdRubro(Integer.parseInt(this.getMenuRubros().getValue().toString()));
                this.cargarEstadoCom(listaComponentes);
            }
            this.getSession().setAttribute("boolBotonFinal", this.isBoolBotonFinal());
            this.getSession().setAttribute("boolBotonGuardar", this.isBoolBotonGuardar());
            this.getSession().setAttribute("boolInputText", this.isBoolInputText());
            this.getSession().setAttribute("listaComponentes", listaComponentes);
        } catch (PresupuestoException ex) {
            Logger.getLogger(RubroConceptoEstimado.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    protected void cargarEstadoCom(List<ComponenteVO> listaComp) {
        double totalComponente = 0;
        double totalPresupuesto = 0;
        listaComponentes = presupuestosBO.listarPresupComEst(idProyecto, idRubro, listaComp);
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                totalComponente = totalComponente + this.getListaComponentes().get(i).getLstFuentes().get(j).getValorPorDistribuir();
            }
            this.getListaComponentes().get(i).setValorPresupuestado(totalComponente);
            totalComponente = 0;
        }
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            totalPresupuesto = totalPresupuesto + this.getListaComponentes().get(i).getValorPresupuestado();
        }
        this.setPresupDistribuido(totalPresupuesto);
 /*       this.setBoolBotonGuardar(true);
        this.setBoolInputText(true);
        this.setBoolBotonFinal(false);
        this.getSession().setAttribute("boolBotonFinal", this.isBoolBotonFinal());*/
        this.getSession().setAttribute("presDis", this.getPresupDistribuido());
   /*     this.getSession().setAttribute("boolBotonGuardar", this.isBoolBotonGuardar());
        this.getSession().setAttribute("boolInputText", this.isBoolInputText());*/

    }

    /**
     * Se ejecuta cuando se asigna un valor a distribuir para un componente
     * @param vce
     */
    public void actionInputValorFuente(ValueChangeEvent vce) {
        double valorAntFuente = Double.parseDouble(vce.getOldValue().toString());
        double valorFuente = Double.parseDouble(vce.getNewValue().toString());
        double diferencia = 0;
        double totalComponente = 0;
        double totalPresupuesto = 0;
        double valorPorDistribuir = 0;
        double nuevoValorPorDis = 0;
        UIParameter idComponenteParam = (UIParameter) vce.getComponent().findComponent("idComponente");
        UIParameter idFuenteParam = (UIParameter) vce.getComponent().findComponent("idFuente");
        this.cargarListaComponentes(idComponenteParam, idFuenteParam, valorFuente, totalComponente, totalPresupuesto);
        this.calcularValorFuentePorDistribuir(idComponenteParam, totalComponente, totalPresupuesto, diferencia, valorAntFuente, valorFuente, idFuenteParam, valorPorDistribuir, nuevoValorPorDis);
        this.getSession().setAttribute("listaComponentes", this.getListaComponentes());
    }

    /**
     * Carga la lista de componentes y fuentes con los valores asignados
     * @param idComponenteParam
     * @param idFuenteParam
     * @param valorFuente
     * @param totalComponente
     * @param totalPresupuesto
     */
    protected void cargarListaComponentes(UIParameter idComponenteParam, UIParameter idFuenteParam, double valorFuente, double totalComponente, double totalPresupuesto) {
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            if (this.getListaComponentes().get(i).getCodigoComponente() == Integer.parseInt(idComponenteParam.getValue().toString())) {
                for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                    if (this.getListaComponentes().get(i).getLstFuentes().get(j).getIdFuenteF() == Integer.parseInt(idFuenteParam.getValue().toString())) {
                        this.getListaComponentes().get(i).getLstFuentes().get(j).setValorPorDistribuir(valorFuente);
                    }
                }
            }
        }
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                totalComponente = totalComponente + this.getListaComponentes().get(i).getLstFuentes().get(j).getValorPorDistribuir();
            }
            this.getListaComponentes().get(i).setValorPresupuestado(totalComponente);
            totalComponente = 0;
        }
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            totalPresupuesto = totalPresupuesto + this.getListaComponentes().get(i).getValorPresupuestado();
        }
        this.setPresupDistribuido(totalPresupuesto);
        this.getSession().setAttribute("presDis", this.getPresupDistribuido());
    }

    /**
     * Calcula el presupuesto distribuido por fuente y controla que el presupuesto distribuido no sobrepase el presupuesto disponible por fuente
     * @param idComponenteParam
     * @param totalComponente
     * @param totalPresupuesto
     * @param diferencia
     * @param valorAntFuente
     * @param valorFuente
     * @param idFuenteParam
     * @param valorPorDistribuir
     * @param nuevoValorPorDis
     */
    protected void calcularValorFuentePorDistribuir(UIParameter idComponenteParam, double totalComponente, double totalPresupuesto, double diferencia, double valorAntFuente, double valorFuente, UIParameter idFuenteParam, double valorPorDistribuir, double nuevoValorPorDis) {
        diferencia = valorAntFuente - valorFuente;
        boolean verificaMensaje = false;
        boolean control = false;
        double valorTotalPorDistri = valorAntFuente;
        double valorTotalFuente = valorFuente;
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            if (this.getListaComponentes().get(i).getCodigoComponente() != Integer.parseInt(idComponenteParam.getValue().toString())) {
                for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                    if (this.getListaComponentes().get(i).getLstFuentes().get(j).getIdFuenteF() == Integer.parseInt(idFuenteParam.getValue().toString())) {
                        valorTotalPorDistri = valorTotalPorDistri + this.getListaComponentes().get(i).getLstFuentes().get(j).getValorPorDistribuir();
                        valorTotalFuente = valorTotalFuente + this.getListaComponentes().get(i).getLstFuentes().get(j).getValorPorDistribuir();
                        if (control != true) {
                            valorTotalPorDistri = valorTotalPorDistri + this.getListaComponentes().get(i).getLstFuentes().get(j).getValorFuenteF();
                            control = true;
                        }
                    }
                }
            }
        }
        if (valorTotalFuente > valorTotalPorDistri) {
            for (int i = 0; i < this.getListaComponentes().size(); i++) {
                for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                    if (this.getListaComponentes().get(i).getLstFuentes().get(j).getIdFuenteF() == Integer.parseInt(idFuenteParam.getValue().toString())) {
                        valorPorDistribuir = this.getListaComponentes().get(i).getLstFuentes().get(j).getValorFuenteF();
                        this.getListaComponentes().get(i).getLstFuentes().get(j).setValorFuenteF(valorPorDistribuir);
                        this.recargarListaComponente(idComponenteParam, idFuenteParam, valorAntFuente, totalComponente, totalPresupuesto);
                        verificaMensaje = true;
                    }
                }
            }
        }
        if (verificaMensaje == false) {
            for (int i = 0; i < this.getListaComponentes().size(); i++) {
                for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                    if (this.getListaComponentes().get(i).getLstFuentes().get(j).getIdFuenteF() == Integer.parseInt(idFuenteParam.getValue().toString())) {
                        valorPorDistribuir = this.getListaComponentes().get(i).getLstFuentes().get(j).getValorFuenteF();
                        if (diferencia < 0) {

                            nuevoValorPorDis = valorPorDistribuir - valorFuente;
                            if (nuevoValorPorDis < 0) {
                                nuevoValorPorDis = valorPorDistribuir + valorFuente;
                                nuevoValorPorDis = nuevoValorPorDis - valorTotalPorDistri;
                                if (nuevoValorPorDis < 0) {
                                    nuevoValorPorDis = valorFuente - valorAntFuente;
                                    nuevoValorPorDis = valorPorDistribuir - nuevoValorPorDis;
                                } else {
                                    nuevoValorPorDis = valorPorDistribuir - nuevoValorPorDis;
                                }
                                this.getListaComponentes().get(i).getLstFuentes().get(j).setValorFuenteF(nuevoValorPorDis);
                            } else {
                                nuevoValorPorDis = valorPorDistribuir + diferencia;
                                this.getListaComponentes().get(i).getLstFuentes().get(j).setValorFuenteF(nuevoValorPorDis);
                            }

                        } else {
                            nuevoValorPorDis = valorPorDistribuir + diferencia;
                            this.getListaComponentes().get(i).getLstFuentes().get(j).setValorFuenteF(nuevoValorPorDis);
                            if (this.getListaComponentes().get(i).getLstFuentes().get(j).getValorFuenteF() < 0) {
                                this.recargarListaComponente(idComponenteParam, idFuenteParam, valorFuente, totalComponente, totalPresupuesto);
                            }
                        }
                    }
                }
            }
        }
        if (verificaMensaje == true) {
            error("El valor distribuido no debe sobrepasar el valor asignado");
        }

    }

    /**
     * Recargar los valores anteriores de la tabala de componentes cuando el presupuesto distribuido sobrepasa al presupuesto por distribuir
     * @param idComponenteParam
     * @param idFuenteParam
     * @param valorFuente
     * @param totalComponente
     * @param totalPresupuesto
     */
    protected void recargarListaComponente(UIParameter idComponenteParam, UIParameter idFuenteParam, double valorFuente, double totalComponente, double totalPresupuesto) {
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            if (this.getListaComponentes().get(i).getCodigoComponente() == Integer.parseInt(idComponenteParam.getValue().toString())) {
                for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                    if (this.getListaComponentes().get(i).getLstFuentes().get(j).getIdFuenteF() == Integer.parseInt(idFuenteParam.getValue().toString())) {
                        this.getListaComponentes().get(i).getLstFuentes().get(j).setValorPorDistribuir(valorFuente);
                    }
                }
            }
        }
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            for (int j = 0; j < this.getListaComponentes().get(i).getLstFuentes().size(); j++) {
                totalComponente = totalComponente + this.getListaComponentes().get(i).getLstFuentes().get(j).getValorPorDistribuir();
            }
            this.getListaComponentes().get(i).setValorPresupuestado(totalComponente);
            totalComponente = 0;
        }
        for (int i = 0; i < this.getListaComponentes().size(); i++) {
            totalPresupuesto = totalPresupuesto + this.getListaComponentes().get(i).getValorPresupuestado();
        }
        this.setPresupDistribuido(totalPresupuesto);
        this.getSession().setAttribute("presDis", this.getPresupDistribuido());
    }

    public void actionBotonGuardar() {
        try {
            presupuestosBO.guardarPresupComponenteEstimado(idProyecto, PRESUP_STATUS_COMPONENT, idRubro, listaComponentes, TIPO_PRESUPUESTO, usuario);
            this.setBoolBotonGuardar(true);
            this.setBoolInputText(true);
            this.setBoolBotonFinal(false);
            this.getSession().setAttribute("boolBotonFinal", this.isBoolBotonFinal());
            this.getSession().setAttribute("boolBotonGuardar", this.isBoolBotonGuardar());
            this.getSession().setAttribute("boolInputText", this.isBoolInputText());
            info("Se registro correctamente el Presupuesto Estimado por Componente");
        } catch (PresupuestoException ex) {
            Logger.getLogger(RubroConceptoEstimado.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void actionFinalizar() {
        presupuestosBO.modificarPresupuesto(idProyecto, "PORAP");
        info("El presupuesto estimado a finalizado correctamente");

    }

    /************GETTERS Y SETTERS*/
    public long getIdProyecto() {
        return idProyecto;
    }

    public void setIdProyecto(long idProyecto) {
        this.idProyecto = idProyecto;
    }

    public List<rubroProyectoVO> getListaRubros() {
        return listaRubros;
    }

    public void setListaRubros(List<rubroProyectoVO> listaRubros) {
        this.listaRubros = listaRubros;
    }

    public HtmlSelectOneMenu getMenuRubros() {
        return menuRubros;
    }

    public void setMenuRubros(HtmlSelectOneMenu menuRubros) {
        this.menuRubros = menuRubros;
    }

    public double getTotalPresup() {
        return totalPresup;
    }

    public void setTotalPresup(double totalPresup) {
        this.totalPresup = totalPresup;
    }

    public double getPresupDistribuido() {
        return presupDistribuido;
    }

    public void setPresupDistribuido(double presupDistribuido) {
        this.presupDistribuido = presupDistribuido;
    }

    public List<ComponenteVO> getListaComponentes() {
        return listaComponentes;
    }

    public void setListaComponentes(List<ComponenteVO> listaComponentes) {
        this.listaComponentes = listaComponentes;
    }

    public List<SelectItem> getItemRubros() {
        return itemRubros;
    }

    public void setItemRubros(List<SelectItem> itemRubros) {
        this.itemRubros = itemRubros;
    }

    public HttpSession getSession() {
        return (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    }

    public void setSession(HttpSession session) {
        this.session = session;
    }

    public long getIdRubro() {
        return idRubro;
    }

    public void setIdRubro(long idRubro) {
        this.idRubro = idRubro;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public boolean isBoolTablaComponente() {
        return boolTablaComponente;
    }

    public void setBoolTablaComponente(boolean boolTablaComponente) {
        this.boolTablaComponente = boolTablaComponente;
    }

    public boolean isBoolBotonGuardar() {
        return boolBotonGuardar;
    }

    public void setBoolBotonGuardar(boolean boolBotonGuardar) {
        this.boolBotonGuardar = boolBotonGuardar;
    }

    public boolean isBoolInputText() {
        return boolInputText;
    }

    public void setBoolInputText(boolean boolInputText) {
        this.boolInputText = boolInputText;
    }

    public List<rubroProyectoVO> getListaRubroProy() {
        return listaRubroProy;
    }

    public void setListaRubroProy(List<rubroProyectoVO> listaRubroProy) {
        this.listaRubroProy = listaRubroProy;
    }

    public boolean isBoolBotonFinal() {
        return boolBotonFinal;
    }

    public void setBoolBotonFinal(boolean boolBotonFinal) {
        this.boolBotonFinal = boolBotonFinal;
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     *
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {

        // Perform initializations inherited from our superclass
        super.init();
// Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here
// <editor-fold defaultstate="collapsed" desc="Visual-Web-managed Component Initialization">
// Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("Page1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() {
    }
}

